home *** CD-ROM | disk | FTP | other *** search
/ FishMarket 1.0 / FishMarket v1.0.iso / fishies / 326-350 / disk_349 / med / source / medplayer200src.zoo / medplayer.c < prev   
C/C++ Source or Header  |  1990-04-03  |  5KB  |  198 lines

  1. /* ---------------------------------------- */
  2. /* MEDPlayer.c V2.00 by Teijo Kinnunen 1990 */
  3. /* ---------------------------------------- */
  4. #include <workbench/startup.h>
  5. #include <workbench/icon.h>
  6. #include <workbench/workbench.h>
  7. #include "med.h"
  8. struct Kappale far tamakappale;
  9. struct SoundTrackerKappale far ladattu;
  10. UWORD lohkoja = 0,chip zeroptr = 0;
  11. struct Window *window = NULL;
  12. struct Lohko *blocks[100];
  13. struct Soitin *samples[33];
  14. struct ObjSong song;
  15. extern struct CIA far ciaa;
  16. extern struct WBStartup *WBenchMsg;
  17. void FreeAllBlocks(),VapautaSoittimet(),Ilmoita();
  18. struct Library *IconBase = NULL;
  19. BOOL clistartup = FALSE,LoadSong();
  20. BPTR outputfh;
  21. static char defaulttitle[] = "MEDPlayer V2.00 by Teijo Kinnunen, 1990";
  22.  
  23. void MakeObjSong()
  24. {
  25.     UBYTE scnt = 0;
  26.     for(scnt = 0; scnt < 32; scnt++) {
  27.         song.vol[scnt] = tamakappale.soittimenvoimakkuus[scnt];
  28.         song.rep[scnt] = tamakappale.stoisto[scnt];
  29.         song.replen[scnt] = tamakappale.stoistonpit[scnt];
  30.         song.midichan[scnt] = tamakappale.midikanava[scnt];
  31.         song.midipres[scnt] = tamakappale.midipreset[scnt];
  32.     }
  33.     song.blocks = lohkoja;
  34.     memcpy(song.playseq,tamakappale.soittojarjestys,100);
  35.     song.songlen = tamakappale.kappaleen_pituus;
  36.     song.playtransp = tamakappale.playtransp;
  37.     song.flags = tamakappale.liput;
  38.     song.slide = tamakappale.vaihtoja;
  39. }
  40.  
  41. void Play()
  42. {
  43.     struct Message *imsg;
  44.     MakeObjSong();
  45.     if(InitPlayer()) return;
  46.     SetTempo(tamakappale.tempo);
  47.     StartPlayer();
  48.     if(clistartup) {
  49.         Write(outputfh,"Press Ctrl-C to quit\n",21);
  50.         Wait(SIGBREAKF_CTRL_C);
  51.     } else {
  52.         Ilmoita(defaulttitle);
  53.         WaitPort(window->UserPort);
  54.         imsg = GetMsg(window->UserPort);
  55.         ReplyMsg(imsg);
  56.     }
  57.     StopPlayer();
  58. }
  59.  
  60. void PrintUsage()
  61. {
  62.     Write(outputfh,"MEDPlayer usage:\n",17);
  63.     Write(outputfh,"  MEDPlayer song [pathfile]\n",28);
  64. }
  65.  
  66. BOOL CLIStartup(char *cmdline)
  67. {
  68.     char *argv[3],argc = 0,quote = 0;
  69.     outputfh = Output();
  70.     clistartup = TRUE;
  71.     Write(outputfh,"MEDPlayer V2.00 by Teijo Kinnunen, 1990\n",40);
  72.     for(;;) {    /* The command line parser */
  73.         if(*cmdline == '\"') {
  74.             if((quote = (!quote)) == FALSE) *cmdline = '\0';
  75.         }
  76.         else if((*cmdline == '\t'||*cmdline == ' ') && !quote) {
  77.             *cmdline = '\0';
  78.             if(++argc >= 3) break;
  79.             while(*(++cmdline) == ' ' || *cmdline == '\t');
  80.             argv[argc] = (*cmdline == '\"' ? cmdline+1 : cmdline);
  81.             continue;
  82.         }
  83.         else if(*cmdline == '\n' || *cmdline == '\0') {
  84.             *cmdline = '\0'; argc++; break; }
  85.         cmdline++;
  86.     }
  87.     if(argc < 2 || argc > 3 || *argv[1] == '?' || !(*argv[1])) {
  88.         PrintUsage();
  89.         return(TRUE);
  90.     }
  91.     LataaSoitinLista(argc == 3 ? argv[2] : NULL);
  92.     return(LoadSong(argv[1]));
  93. }
  94.  
  95. BOOL WBenchStartup()
  96. {
  97.     struct DiskObject *plr;
  98.     char *pathf;
  99.     struct WBArg *wbarg;
  100.     if(!(IconBase = OpenLibrary(ICONNAME,0))) return(TRUE);
  101.     if(WBenchMsg->sm_NumArgs < 2) return(TRUE);
  102.     wbarg = WBenchMsg->sm_ArgList;
  103.     CurrentDir(wbarg[1].wa_Lock);
  104.     if(!(plr = GetDiskObject(wbarg[1].wa_Name))) return(TRUE);
  105.     pathf = FindToolType(plr->do_ToolTypes,"PATHF");
  106.     LataaSoitinLista(pathf);
  107.     FreeDiskObject(plr);
  108.     return(LoadSong(wbarg[1].wa_Name));
  109. }
  110.  
  111. static BOOL Window()
  112. {
  113.     static struct NewWindow nw = {
  114.         230,10,400,10,2,1,CLOSEWINDOW,WINDOWDEPTH|WINDOWCLOSE|
  115.         WINDOWDRAG|SIMPLE_REFRESH|NOCAREREFRESH|RMBTRAP,
  116.         NULL,NULL,NULL,NULL,NULL,0,0,0,0,WBENCHSCREEN };
  117.     nw.Title = defaulttitle;
  118.     if(!(window = OpenWindow(&nw))) return(TRUE);
  119.     return(FALSE);
  120. }
  121.  
  122. static void CloseDown()
  123. {
  124.     ciaa.ciapra &= ~CIAF_LED;
  125.     if(clistartup)    Write(outputfh,"\n",1);
  126.     RemPlayer();
  127.     FreeAllBlocks();
  128.     if(window) CloseWindow(window);
  129.     VapautaSoittimet();
  130.     VapautaSoitinLista();
  131.     if(IconBase) CloseLibrary(IconBase);
  132.     CloseLibrary(IntuitionBase);
  133. }
  134.  
  135. void Ilmoita(char *text)
  136. {
  137.     if(clistartup) {
  138.         Write(outputfh,text,strlen(text));
  139.         Write(outputfh,"                                                  ",
  140.             50 - strlen(text));
  141.         Write(outputfh,"\x0d",1);
  142.     } else SetWindowTitles(window,text,(char *)-1);
  143. }
  144.  
  145. void _main(char *cmdline)
  146. {
  147.     if(!(IntuitionBase = OpenLibrary("intuition.library",0))) return;
  148.     if(!WBenchMsg) { if(!CLIStartup(cmdline)) Play(); }
  149.     else if(!Window()) if(!WBenchStartup()) Play();
  150.     CloseDown();
  151. }
  152.  
  153. void FreeBlock(num)
  154. UWORD num;
  155. {
  156.     if(blocks[num]) {
  157.         FreeMem(blocks[num],4 + blocks[num]->numtracks * ONETRKSIZE);
  158.         blocks[num] = 0L;
  159.     }
  160. }
  161.  
  162. BOOL AllocBlock(UWORD num,UBYTE tracks) /* TRUE = virhe, FALSE = ok!! */
  163. {
  164.     if(blocks[num]) {
  165.         if(blocks[num]->numtracks == tracks) return(FALSE);
  166.         FreeBlock(num);
  167.     }
  168.     if(!(blocks[num] = AllocMem(4 + ONETRKSIZE * tracks,MEMF_PUBLIC|
  169.         MEMF_CLEAR))) return(TRUE);
  170.     blocks[num]->numtracks = tracks;
  171.     return(FALSE);
  172. }
  173.  
  174. void FreeAllBlocks()
  175. {
  176.     int cnt;
  177.     for(cnt = 0; cnt < 100; cnt++) FreeBlock(cnt);
  178. }
  179.  
  180. void VapautaSoittimet()
  181. {
  182.   UCOUNT slsk;
  183.   for(slsk = 1; slsk < 32; slsk++)
  184.     if(samples[slsk]) {
  185.       FreeMem((void *)samples[slsk],samples[slsk]->length + sizeof(struct Soitin));
  186.       samples[slsk] = NULL;
  187.       tamakappale.soitin[slsk][0] = '\0';
  188.     }
  189. }
  190.  
  191. void Ilmoita2(char *txt1,char *txt2)
  192. {
  193.     char info[100];
  194.     strcpy(info,txt1);
  195.     strcat(info,txt2);
  196.     Ilmoita(info);
  197. }
  198.